import { Agent } from '@mastra/core/agent';
import { LibSQLStore } from '@mastra/libsql';
import { Memory } from '@mastra/memory';
import { createModel } from '../provider/model';
import { gameManagementTool } from '../tools/game-management.tool';

/**
 * 游戏管理Agent
 * 统一处理所有游戏相关操作，包括：
 * - 开始新游戏/生成案件
 * - 与嫌疑人对话
 * - 提交推理结果
 * - 获取游戏状态
 * - 游戏进度管理
 */
export const gameManagerAgent = new Agent({
  instructions: `
    你是赛博侦探游戏的智能游戏管理助手，负责协调和管理整个游戏流程。
    
    ## 核心职责
    1. **案件生成管理** - 根据玩家需求生成合适难度的推理案件
    2. **对话协调** - 管理侦探与嫌疑人之间的对话交互
    3. **游戏状态跟踪** - 实时跟踪游戏进度、线索发现、时间管理
    4. **推理评估** - 评估玩家的推理结果并给出反馈
    5. **游戏体验优化** - 根据玩家行为调整游戏难度和提示
    
    ## 操作指南
    
    ### 开始新游戏
    - 接收玩家的游戏配置（难度、主题、嫌疑人数量）
    - 调用案件生成系统创建完整的案件
    - 初始化游戏状态和计时器
    - 返回案件基本信息和初始线索
    
    ### 对话管理
    - 接收玩家与特定嫌疑人的对话请求
    - 根据案件背景和嫌疑人性格生成合适的回应
    - 控制线索的逐步揭示
    - 管理嫌疑人的情绪状态变化
    
    ### 推理评估
    - 接收玩家的最终推理结果
    - 对比真实答案进行评分
    - 分析推理过程的逻辑性
    - 提供详细的反馈和解释
    
    ### 游戏状态管理
    - 实时更新游戏进度
    - 管理时间限制和倒计时
    - 跟踪已发现的线索
    - 记录与嫌疑人的互动历史
    
    ## 交互原则
    - 始终使用 game-management 工具来执行具体操作
    - 根据操作类型调用相应的功能模块
    - 确保游戏体验的连贯性和逻辑性
    - 提供清晰的状态反馈和错误处理
    
    ## 响应格式
    所有操作都通过工具调用完成，确保返回结构化的JSON数据，包含：
    - success: 操作是否成功
    - data: 相关数据（案件信息、对话内容、游戏状态等）
    - message: 操作结果说明
    - gameState: 当前游戏状态（如适用）
    
    记住：你是玩家的游戏伙伴，要确保游戏体验既有挑战性又充满乐趣！
  `,
  model: createModel(),
  tools: { gameManagementTool },
  memory: new Memory({
    storage: new LibSQLStore({
      url: 'file:../mastra.db',
    }),
  }),
});

/**
 * 游戏管理Agent的便捷调用方法
 * @param action 操作类型
 * @param params 操作参数
 * @returns 操作结果
 */
export async function callGameManager(action: string, params: any) {
  try {
    console.log(`游戏管理Agent执行操作: ${action}`, params);
    
    // 构建提示词
    const prompt = `请执行游戏操作：${action}
    
    操作参数：${JSON.stringify(params, null, 2)}
    
    请使用 game-management 工具来处理这个请求，确保返回完整的操作结果。`;
    
    // 调用Agent
    const response = await gameManagerAgent.streamVNext([
      {
        role: 'user',
        content: prompt,
      },
    ]);
    
    // 处理流式响应
    let textResult = '';
    for await (const chunk of response.textStream) {
      textResult += chunk;
    }
    
    console.log('游戏管理Agent响应:', textResult);
    
    // 从工具调用结果中提取数据
    const toolCalls = response.toolCalls;
    if (toolCalls && toolCalls.length > 0) {
      console.log('工具调用成功:', toolCalls[0]);
      return toolCalls[0].result;
    }
    
    // 如果没有工具调用，返回文本响应
    return {
      success: false,
      message: '操作未能完成，请重试',
      data: null,
      textResponse: textResult
    };
    
  } catch (error) {
    console.error('游戏管理Agent调用失败:', error);
    throw new Error(`游戏管理操作失败: ${error instanceof Error ? error.message : '未知错误'}`);
  }
}

/**
 * 专门用于开始新游戏的便捷方法
 */
export async function startNewGame(difficulty: string, theme?: string, suspectCount: number = 3) {
  return await callGameManager('start_game', {
    difficulty,
    theme,
    suspectCount
  });
}

/**
 * 专门用于嫌疑人对话的便捷方法
 */
export async function chatWithSuspect(gameId: string, suspectId: string, question: string, conversationHistory: any[] = []) {
  return await callGameManager('chat_with_suspect', {
    gameId,
    suspectId,
    question,
    conversationHistory
  });
}

/**
 * 专门用于提交推理的便捷方法
 */
export async function submitDeduction(gameId: string, deduction: any) {
  return await callGameManager('submit_deduction', {
    gameId,
    ...deduction
  });
}

/**
 * 专门用于获取游戏状态的便捷方法
 */
export async function getGameStatus(gameId: string) {
  return await callGameManager('get_game_status', {
    gameId
  });
}
